package org.gap.service;

import java.util.List;
import java.util.Set;

import org.gap.dao.UtilisateursDAO;
import org.gap.dao.UtilisateursGroupeDAO;

import org.gap.domain.Utilisateurs;
import org.gap.domain.UtilisateursGroupe;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for UtilisateursGroupe entities
 * 
 */

@Service("UtilisateursGroupeService")
@Transactional
public class UtilisateursGroupeServiceImpl implements UtilisateursGroupeService {

	/**
	 * DAO injected by Spring that manages Utilisateurs entities
	 * 
	 */
	@Autowired
	private UtilisateursDAO utilisateursDAO;

	/**
	 * DAO injected by Spring that manages UtilisateursGroupe entities
	 * 
	 */
	@Autowired
	private UtilisateursGroupeDAO utilisateursGroupeDAO;

	/**
	 * Instantiates a new UtilisateursGroupeServiceImpl.
	 *
	 */
	public UtilisateursGroupeServiceImpl() {
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public UtilisateursGroupe saveUtilisateursGroupeUtilisateurs(String ugrGroupe, String ugrUser, Utilisateurs related_utilisateurs) {
		UtilisateursGroupe utilisateursgroupe = utilisateursGroupeDAO.findUtilisateursGroupeByPrimaryKey(ugrGroupe, ugrUser, -1, -1);
		Utilisateurs existingutilisateurs = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateurs.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateurs != null) {
			existingutilisateurs.setUsrUser(related_utilisateurs.getUsrUser());
			existingutilisateurs.setUsrPassword(related_utilisateurs.getUsrPassword());
			existingutilisateurs.setUsrService(related_utilisateurs.getUsrService());
			existingutilisateurs.setUsrMail(related_utilisateurs.getUsrMail());
			existingutilisateurs.setUsrEnabled(related_utilisateurs.getUsrEnabled());
			related_utilisateurs = existingutilisateurs;
		}

		utilisateursgroupe.setUtilisateurs(related_utilisateurs);
		related_utilisateurs.getUtilisateursGroupes().add(utilisateursgroupe);
		utilisateursgroupe = utilisateursGroupeDAO.store(utilisateursgroupe);
		utilisateursGroupeDAO.flush();

		related_utilisateurs = utilisateursDAO.store(related_utilisateurs);
		utilisateursDAO.flush();

		return utilisateursgroupe;
	}

	/**
	 * Return a count of all UtilisateursGroupe entity
	 * 
	 */
	@Transactional
	public Integer countUtilisateursGroupes() {
		return ((Long) utilisateursGroupeDAO.createQuerySingleResult("select count(*) from UtilisateursGroupe o").getSingleResult()).intValue();
	}

	/**
	 * Load an existing UtilisateursGroupe entity
	 * 
	 */
	@Transactional
	public Set<UtilisateursGroupe> loadUtilisateursGroupes() {
		return utilisateursGroupeDAO.findAllUtilisateursGroupes();
	}

	/**
	 * Return all UtilisateursGroupe entity
	 * 
	 */
	@Transactional
	public List<UtilisateursGroupe> findAllUtilisateursGroupes(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<UtilisateursGroupe>(utilisateursGroupeDAO.findAllUtilisateursGroupes(startResult, maxRows));
	}

	/**
	 */
	@Transactional
	public UtilisateursGroupe findUtilisateursGroupeByPrimaryKey(String ugrGroupe, String ugrUser) {
		return utilisateursGroupeDAO.findUtilisateursGroupeByPrimaryKey(ugrGroupe, ugrUser);
	}

	/**
	 * Save an existing UtilisateursGroupe entity
	 * 
	 */
	@Transactional
	public void saveUtilisateursGroupe(UtilisateursGroupe utilisateursgroupe) {
		UtilisateursGroupe existingUtilisateursGroupe = utilisateursGroupeDAO.findUtilisateursGroupeByPrimaryKey(utilisateursgroupe.getUgrGroupe(), utilisateursgroupe.getUgrUser());

		if (existingUtilisateursGroupe != null) {
			if (existingUtilisateursGroupe != utilisateursgroupe) {
				existingUtilisateursGroupe.setUgrGroupe(utilisateursgroupe.getUgrGroupe());
				existingUtilisateursGroupe.setUgrUser(utilisateursgroupe.getUgrUser());
			}
			utilisateursgroupe = utilisateursGroupeDAO.store(existingUtilisateursGroupe);
		} else {
			utilisateursgroupe = utilisateursGroupeDAO.store(utilisateursgroupe);
		}
		utilisateursGroupeDAO.flush();
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public UtilisateursGroupe deleteUtilisateursGroupeUtilisateurs(String utilisateursgroupe_ugrGroupe, String utilisateursgroupe_ugrUser, String related_utilisateurs_usrUser) {
		UtilisateursGroupe utilisateursgroupe = utilisateursGroupeDAO.findUtilisateursGroupeByPrimaryKey(utilisateursgroupe_ugrGroupe, utilisateursgroupe_ugrUser, -1, -1);
		Utilisateurs related_utilisateurs = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateurs_usrUser, -1, -1);

		utilisateursgroupe.setUtilisateurs(null);
		related_utilisateurs.getUtilisateursGroupes().remove(utilisateursgroupe);
		utilisateursgroupe = utilisateursGroupeDAO.store(utilisateursgroupe);
		utilisateursGroupeDAO.flush();

		related_utilisateurs = utilisateursDAO.store(related_utilisateurs);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateurs);
		utilisateursDAO.flush();

		return utilisateursgroupe;
	}

	/**
	 * Delete an existing UtilisateursGroupe entity
	 * 
	 */
	@Transactional
	public void deleteUtilisateursGroupe(UtilisateursGroupe utilisateursgroupe) {
		utilisateursGroupeDAO.remove(utilisateursgroupe);
		utilisateursGroupeDAO.flush();
	}
}
